package ATM;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

/**
 * @author chihb
 * @create-time 2024/6/20 21:51
 * @description
 */
public class ATM {
    private ArrayList<Account> accounts = new ArrayList<>();
    private Scanner sc = new Scanner(System.in);
    private Account loginAcc;//记住登入后的用户账户

    /**
     * 启动ATM系统，展示欢迎界面
     */
    public void start() {
        while (true) {
            System.out.println("===欢迎进入ATM系统===");
            System.out.println("1.用户登入");
            System.out.println("2.用户开户");
            System.out.println("请选择:");
            int command = sc.nextInt();
            switch (command) {
                case 1:
                    //用户登入
                    login();
                    break;
                case 2:
                    //用户开户
                    createAccount();
                    break;
                default:
                    System.out.println("输入错误请重新输入");
            }
        }
    }

    /**
     * 完成用户登入
     */
    private void login() {
        System.out.println("===系统登入===");
        if (accounts.isEmpty()) {
            System.out.println("当前系统没有任何账户，请先开户，在登入");
            return;
        }
        while (true) {
            System.out.println("请输入您的账户卡号");
            String cardId = sc.next();
            Account acc = getAccountByCardId(cardId);
            if (acc != null) {
                System.out.println("请输入您的账户密码");
                String pwd = sc.next();
                if (pwd.equals(acc.getPassWord())) {
                    loginAcc = acc;
                    System.out.println("恭喜你" + acc.getUserName() + "登入成功");
                    showUserCommand();
                    return;
                } else {
                    System.out.println("你输入的密码错误---请确认");
                }
            } else {
                System.out.println("你输入的卡号不存在---请确认");
            }
        }
    }

    /**
     * 展示用户的登入界面
     */
    private void showUserCommand() {
        while (true) {
            System.out.println(loginAcc.getUserName() + ",您可以选择如下功能进行账户处理");
            System.out.println("1.查询账户");
            System.out.println("2.存款");
            System.out.println("3.取款");
            System.out.println("4.转账");
            System.out.println("5.密码修改");
            System.out.println("6.退出");
            System.out.println("7.注销当前账户");
            System.out.println("请选择:");
            int command = sc.nextInt();
            switch (command){
                case 1:
                    //查询当前用户
                    showLoginAcc();
                    break;
                case 2:
                    //存款
                    depositMoney();
                    break;
                case 3:
                    //取款
                    drawMoney();
                    break;
                case 4:
                    //转账
                    transferMoney();
                    break;
                case 5:
                    //密码修改
                    updatePassword();
                    return;
                case 6:
                    //退出
                    System.out.println(loginAcc.getUserName()+",您退出系统成功");
                    return;
                case 7:
                    //注销当前账户
                    if(deleteAccount()){
                        //销户成功回到欢迎界面
                        return;
                    }
                    break;
                default:
                    System.out.println("输入错误请重新输入");
            }
        }
    }

    /**
     * 修改密码
     */
    private void updatePassword() {
        System.out.println("修改密码操作");
        while (true) {
            System.out.println("请输入当前用户密码");
            String pwd=sc.next();
            if(pwd.equals(loginAcc.getPassWord())){
                System.out.println("请输入新的密码");
                String newPwd=sc.next();
                System.out.println("请再次输入新的密码");
                String twoPwd=sc.next();
                if(newPwd.equals(twoPwd)){
                    loginAcc.setPassWord(newPwd);
                    System.out.println("修改密码成功");
                    return;
                }
            }else {
                System.out.println("您输入的密码与当前用户不符，请重新输入");
                break;
            }
        }
    }

    /**
     * 销户
     */
    private boolean deleteAccount() {
        System.out.println("用户销户操作");
        System.out.println("您确定要进行销户吗？y/n");
        String text= sc.next();
        if(text.equalsIgnoreCase("n")){
            System.out.println("好的，您的账户将被保留");
            return false;
        }else {
            if(loginAcc.getMoney()>0){
                System.out.println("您的账户还有余额"+loginAcc.getMoney()+"，无法注销");
                return false;
            }else {
                accounts.remove(loginAcc);
                System.out.println("您的账户已经成功注销");
                return true;
            }
        }
    }

    /**
     * 转账
     */
    private void transferMoney() {
        System.out.println("用户转账操作");
        if(accounts.size()<2){
            System.out.println("当前账户中只有你一个账户，无法为其他账户账");
            return;
        }
        if(loginAcc.getMoney()<0){
            System.out.println("当前账户存款为0元");
            return;
        }
        while (true) {
            System.out.println("输入对方的卡号");
            String carId=sc.next();
            Account acc=getAccountByCardId(carId);
            if(acc==null){
                System.out.println("您输入对方的卡号不存在");
            }else {
                String newName= "*"+acc.getUserName().substring(1);
                System.out.println("请输入"+newName+"的姓氏");
                String name=sc.next();
                if(acc.getUserName().startsWith(name)){
                    while (true) {
                        System.out.println("请输入转账给对方的金额");
                        double money=sc.nextDouble();
                        if(money>loginAcc.getMoney()){
                            System.out.println("您的余额不足，无法给对方转这么多钱，最多可转:"+loginAcc.getMoney());
                        }else {
                            loginAcc.setMoney(loginAcc.getMoney()-money);
                            acc.setMoney(acc.getMoney()+money);
                            System.out.println("转账成功");
                            return;
                        }
                    }
                }else {
                    System.out.println("对不起，您的转账姓氏有问题");
                }
            }
        }

    }

    /**
     * 取款
     */
    private void drawMoney() {
        System.out.println("取钱操作");
        if(loginAcc.getMoney()<=0){
            System.out.println("您的账户余额为0元");
            return;
        }
        while (true) {
            System.out.println("请输入你的金额");
            double money=sc.nextDouble();
            if(money>loginAcc.getMoney()){
                System.out.println("余额不足，您的账户余额是："+loginAcc.getMoney());
            }else {
                if(money>loginAcc.getLimit()){
                    System.out.println("您当前取款金额超过了每次限制，您最多可取："+loginAcc.getLimit());
                }else {
                    double newMoney=loginAcc.getMoney()-money;
                    loginAcc.setMoney(newMoney);
                    break;
                }

                System.out.println("您已经取出"+money+"元，还剩余额:"+loginAcc.getMoney());
            }
        }
    }

    /**
     * 存款
     */
    private void depositMoney() {
        System.out.println("存钱操作");
        System.out.println("请输入您的金额");
        double money=sc.nextDouble();
        double newMoney= loginAcc.getMoney()+money;
        loginAcc.setMoney(money);
        System.out.println("恭喜你，您存钱:"+newMoney+"成功,存钱后余额为："+loginAcc.getMoney());
    }

    /**
     * 查询账户
     */
    private void showLoginAcc(){
        System.out.println("当前您的账户信息");
        System.out.println("卡号:"+loginAcc.getCardId());
        System.out.println("账户名:"+loginAcc.getUserName());
        System.out.println("性别:"+loginAcc.getSex());
        System.out.println("余额:"+loginAcc.getMoney());
        System.out.println("每次取现额度:"+loginAcc.getLimit());
    }


    /**
     * 完成用户开户
     */
    private void createAccount() {
        System.out.println("===系统开户操作===");
        //1.创建一个账户对象，用于封装用户的开户信息
        Account account = new Account();
        System.out.println("请输入您的账户名称");
        String name = sc.next();
        account.setUserName(name);

        while (true) {
            System.out.println("请输入您的性别");
            String gender = sc.next();
            if (gender.equals("男") || gender.equals("女")) {
                account.setSex(gender.charAt(0));
                break;
            } else {
                System.out.println("输入错误请重新输入");
            }
        }

        while (true) {
            System.out.println("请输入您的账户密码");
            String pwd = sc.next();
            System.out.println("请再次输入您的账户密码");
            String pwd2 = sc.next();
            if (pwd2.equals(pwd)) {
                account.setPassWord(pwd2);
                break;
            } else {
                System.out.println("输入错误请重新输入");
            }
        }

        System.out.println("请输入你的取现额度");
        Double limit = sc.nextDouble();
        account.setLimit(limit);

        String newCardId = createCardId();
        account.setCardId(newCardId);

        accounts.add(account);
        System.out.println("恭喜你," + account.getUserName() + "开户成功，您的卡号是:" + newCardId);
    }

    /**
     * 返回8位数字卡号
     */
    private String createCardId() {
        while (true) {
            String cardId = "";
            Random r = new Random();
            for (int i = 0; i < 8; i++) {
                cardId += r.nextInt(10);
            }
            Account acc = getAccountByCardId(cardId);
            if (acc == null) {
                return cardId;
            }
        }
    }

    /**
     * 根据卡号查账户对象
     */
    private Account getAccountByCardId(String cardId) {
        for (int i = 0; i < accounts.size(); i++) {
            Account acc = accounts.get(i);
            if (acc.getCardId().equals(cardId)) {
                return acc;
            }
        }
        return null;
    }
}
